]> arthur.barton.de Git - bup.git/commitdiff
Migrate tests to pytest
authorRob Browning <rlb@defaultvalue.org>
Sat, 5 Dec 2020 20:59:00 +0000 (14:59 -0600)
committerRob Browning <rlb@defaultvalue.org>
Sat, 5 Dec 2020 20:59:00 +0000 (14:59 -0600)
199 files changed:
.cirrus.yml
.gitignore
Documentation/bup-gc.md
Documentation/bup-get.md
Documentation/bup-prune-older.md
HACKING
Makefile
README.md
buptest.py [deleted file]
conftest.py [new file with mode: 0644]
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/prep-for-debianish-build
dev/prep-for-freebsd-build
dev/prep-for-macos-build
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]
pytest [new file with mode: 0755]
pytest.ini [new file with mode: 0644]
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/bin/sort-z [new symlink]
test/ext/conftest.py [new file with mode: 0644]
test/ext/test-cat-file [new file with mode: 0755]
test/ext/test-command-without-init-fails [new file with mode: 0755]
test/ext/test-compression [new file with mode: 0755]
test/ext/test-drecurse [new file with mode: 0755]
test/ext/test-fsck [new file with mode: 0755]
test/ext/test-fuse [new file with mode: 0755]
test/ext/test-gc [new file with mode: 0755]
test/ext/test-help [new file with mode: 0755]
test/ext/test-import-duplicity [new file with mode: 0755]
test/ext/test-import-rdiff-backup [new file with mode: 0755]
test/ext/test-index [new file with mode: 0755]
test/ext/test-index-check-device [new file with mode: 0755]
test/ext/test-index-clear [new file with mode: 0755]
test/ext/test-list-idx [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 [new file with mode: 0755]
test/ext/test-meta [new file with mode: 0755]
test/ext/test-misc [new file with mode: 0755]
test/ext/test-on [new file with mode: 0755]
test/ext/test-packsizelimit [new file with mode: 0755]
test/ext/test-redundant-saves [new file with mode: 0755]
test/ext/test-release-archive [new file with mode: 0755]
test/ext/test-restore-map-owner [new file with mode: 0755]
test/ext/test-restore-single-file [new file with mode: 0755]
test/ext/test-rm [new file with mode: 0755]
test/ext/test-rm-between-index-and-save [new file with mode: 0755]
test/ext/test-save-creates-no-unrefs [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 [new file with mode: 0755]
test/ext/test-save-smaller [new file with mode: 0755]
test/ext/test-save-strip-graft [new file with mode: 0755]
test/ext/test-save-with-valid-parent [new file with mode: 0755]
test/ext/test-sparse-files [new file with mode: 0755]
test/ext/test-split-join [new file with mode: 0755]
test/ext/test-tz [new file with mode: 0755]
test/ext/test-web [new file with mode: 0755]
test/ext/test-xdev [new file with mode: 0755]
test/ext/test_argv.py [new file with mode: 0644]
test/ext/test_ftp.py [new file with mode: 0644]
test/ext/test_get.py [new file with mode: 0644]
test/ext/test_prune_older.py [new file with mode: 0644]
test/int/__init__.py [new file with mode: 0644]
test/int/test_bloom.py [new file with mode: 0644]
test/int/test_client.py [new file with mode: 0644]
test/int/test_compat.py [new file with mode: 0644]
test/int/test_git.py [new file with mode: 0644]
test/int/test_hashsplit.py [new file with mode: 0644]
test/int/test_helpers.py [new file with mode: 0644]
test/int/test_index.py [new file with mode: 0644]
test/int/test_metadata.py [new file with mode: 0644]
test/int/test_options.py [new file with mode: 0644]
test/int/test_resolve.py [new file with mode: 0644]
test/int/test_shquote.py [new file with mode: 0644]
test/int/test_vfs.py [new file with mode: 0644]
test/int/test_vint.py [new file with mode: 0644]
test/int/test_xstat.py [new file with mode: 0644]
test/lib/__init__.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/lib/wvpytest.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 [deleted file]
wvtest-bup.sh
wvtest.py [deleted file]
wvtest.sh [changed mode: 0755->0644]

index 832cd598b56f0d26465f6331eadd63e0c2242727..d676e7c3f6e6169f87ec04a264561fff806179c4 100644 (file)
@@ -105,7 +105,7 @@ task:
     set -xe
     dev/prep-for-freebsd-build python3
     dev/system-info
-    gmake -j6 PYTHON=python3 check
+    gmake -j6 PYTHON=python3.7 check
 
 task:
   name: macos (py2)
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..9d2f4ff506e5716993edd41b248935bbc9147283 100644 (file)
--- a/HACKING
+++ b/HACKING
@@ -60,20 +60,34 @@ We also love a good "Tested-by:" -- the more the merrier.
 Testing
 =======
 
-You can run the test suite much more quickly via "make -j test" (as
-compared to "make test"), at the expense of slightly more confusing
-output (interleaved parallel test output), and inaccurate intermediate
-success/failure counts, but the final counts displayed should be
-correct.
+Individual tests can be run via
 
-Individual non-Python tests can be run via "./wvtest run t/TEST" and
-if you'd like to see all of the test output, you can omit the wvtest
-run wrapper: "t/TEST"
+    ./pytest 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"
+For example:
 
+    ./pytest test/int/test_git.py
+    ./pytest test/ext/test-ftp
+
+If you have the xdist module installed, then you can specify its `-n`
+option to run the tests in parallel (e.g. `./pytest -nauto ...`), or
+you can specify `-j` to make, which will be translated to xdist with
+`-j` becoming `-nauto` and `-jN` becoming `-nN`.
+
+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.
+
+Currently, all pytests must be located in either test/ext or test/int.
+Internal test filenames must match test_*.py, and external tests must
+be located in text/ext and their filenames must match test-* (see
+test/ext/conftest.py for the handling of the latter).  Any paths
+matching those criteria will be automatically collected by pytest.
+
+Some aspects of the environment are automatically restored after each
+test via fixtures in conftest.py, including the state of the
+environment variables and the working directory; the latter is reset
+to the top of the source tree.
 
 Submitting patches
 ==================
index 51afd1a0a722933812de191408b9af5af648ea21..e45719d6118027d5d841c31370920dfdd07ea710 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,115 +156,29 @@ 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
-
-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
-
-# 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
-       $(pf); cd $$(pwd -P); TMPDIR="$(test_tmp)" \
-         ./wvtest.py  $(python_tests) 2>&1 \
-           | tee -a t/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
-       $(pf); cd $$(pwd -P); TMPDIR="$(test_tmp)" \
-         t/test-get $* 2>&1 | tee -a t/tmp/test-log/$$$$.log
-
-test_get_targets += \
-  tmp-target-run-test-get-replace \
-  tmp-target-run-test-get-universal \
-  tmp-target-run-test-get-ff \
-  tmp-target-run-test-get-append \
-  tmp-target-run-test-get-pick \
-  tmp-target-run-test-get-new-tag \
-  tmp-target-run-test-get-unnamed
-
-# For parallel runs.
-# 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
-       $(pf); cd $$(pwd -P); TMPDIR="$(test_tmp)" \
-         t/test$* 2>&1 | tee -a t/tmp/test-log/$$$$.log
-
-runtests-cmdline: $(test_get_targets) $(subst t/test,tmp-target-run-test,$(cmdline_tests))
+test/tmp:
+       mkdir test/tmp
+
+ifeq (yes,$(shell config/bin/python -c "import xdist; print('yes')" 2>/dev/null))
+  # MAKEFLAGS must not be in an immediate := assignment
+  parallel_opt = $(lastword $(filter -j%,$(MAKEFLAGS)))
+  get_parallel_n = $(patsubst -j%,%,$(parallel_opt))
+  maybe_specific_n = $(if $(filter -j%,$(parallel_opt)),-n$(get_parallel_n))
+  xdist_opt = $(if $(filter -j,$(parallel_opt)),-nauto,$(maybe_specific_n))
+else
+  xdist_opt =
+endif
+
+test: all test/tmp
+       ./pytest $(xdist_opt)
 
 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
-       ./wvtest watch --no-counts \
-         $(MAKE) runtests 2>t/tmp/test-log/$$$$.log
-       ./wvtest report t/tmp/test-log/*.log
-
 check: test
 
 distcheck: all
-       ./wvtest run t/test-release-archive.sh
+       ./pytest $(xdist_opt) -m release
 
 long-test: export BUP_TEST_LEVEL=11
 long-test: test
@@ -330,18 +244,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..c3815582482fb77d7a546ce1fa527b38bd008b35 100644 (file)
--- a/README.md
+++ b/README.md
@@ -152,6 +152,7 @@ From source
     apt-get install python-pyxattr
     apt-get install pkg-config linux-libc-dev libacl1-dev
     apt-get install acl attr
+    apt-get isntall python-pytest-xdist # optional (parallel tests)
     apt-get install libreadline-dev # optional (bup ftp)
     apt-get install python-tornado # optional (bup web)
     ```
@@ -198,6 +199,14 @@ From source
     make check
     ```
        
+    If you have the Python xdist module installed, then you can
+    probably run the tests faster by adding the make -j option (see <a
+    href="HACKING">./HACKING</a> for additional information):
+
+    ```sh
+    make -j check
+    ```
+
     The tests should pass.  If they don't pass for you, stop here and
     send an email to bup-list@googlegroups.com.  Though if there are
     symbolic links along the current working directory path, the tests
@@ -453,20 +462,20 @@ 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
-   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
-   warrant further investigation).  Possibly related:
+ - In test/ext/test-misc, 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 warrant further investigation).  Possibly related:
    http://cygwin.com/ml/cygwin/2007-06/msg00436.html
 
 
@@ -474,7 +483,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/conftest.py b/conftest.py
new file mode 100644 (file)
index 0000000..9045072
--- /dev/null
@@ -0,0 +1,106 @@
+
+from __future__ import absolute_import, print_function
+from os.path import basename, dirname, realpath, relpath
+from time import tzset
+from traceback import extract_stack
+import errno
+import os
+import pytest
+import re
+import subprocess
+import sys
+import tempfile
+
+sys.path[:0] = ['lib']
+
+from bup import helpers
+from bup.compat import environ, fsencode
+
+
+_bup_src_top = realpath(dirname(fsencode(__file__)))
+
+# 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
+os.chdir(realpath(os.getcwd()))
+
+# Make the test results available to fixtures
+@pytest.hookimpl(tryfirst=True, hookwrapper=True)
+def pytest_runtest_makereport(item, call):
+    other_hooks = yield
+    report = other_hooks.get_result()
+    bup = item.__dict__.setdefault('bup', {})
+    bup[report.when + '-report'] = report  # setup, call, teardown
+    item.bup = bup
+
+def bup_test_sort_order(item):
+    # Pull some slower tests forward to speed parallel runs
+    if item.fspath.basename in ('test_get.py', 'test-index.sh'):
+        return (0, str(item.fspath))
+    return (1, str(item.fspath))
+
+def pytest_collection_modifyitems(session, config, items):
+    items.sort(key=bup_test_sort_order)
+
+@pytest.fixture(autouse=True)
+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)
+            assert False, '%s:%-4d %s' % (basename(src_file),
+                                          src_line, msg)
+
+    fail_if_errors()
+    helpers.clear_errors()
+    yield None
+    fail_if_errors()
+    helpers.clear_errors()
+
+@pytest.fixture(autouse=True)
+def ephemeral_env_changes():
+    orig_env = environ.copy()
+    yield None
+    for k, orig_v in orig_env.items():
+        v = environ.get(k)
+        if v is not orig_v:
+            environ[k] = orig_v
+            if k == b'TZ':
+                tzset()
+    for k in environ.keys():
+        if k not in orig_env:
+            del environ[k]
+            if k == b'TZ':
+                tzset()
+    os.chdir(_bup_src_top)
+
+# Assumes (of course) this file is at the top-level of the source tree
+_bup_test_dir = realpath(dirname(fsencode(__file__))) + b'/test'
+_bup_tmp = _bup_test_dir + b'/tmp'
+try:
+    os.makedirs(_bup_tmp)
+except OSError as e:
+    if e.errno != errno.EEXIST:
+        raise
+
+_safe_path_rx = re.compile(br'[^a-zA-Z0-9_-]')
+
+@pytest.fixture()
+def tmpdir(request):
+    if sys.version_info[0] > 2:
+        rp = realpath(fsencode(request.fspath))
+    else:
+        rp = realpath(str(request.fspath))
+    rp = relpath(rp, _bup_test_dir)
+    if request.function:
+        rp += b'-' + fsencode(request.function.__name__)
+    safe = _safe_path_rx.sub(b'-', rp)
+    tmpdir = tempfile.mkdtemp(dir=_bup_tmp, prefix=safe)
+    yield tmpdir
+    if request.node.bup['call-report'].failed:
+        print('\nPreserving:', b'test/' + relpath(tmpdir, _bup_test_dir),
+              file=sys.stderr)
+    else:
+        subprocess.call(['chmod', '-R', 'u+rwX', tmpdir])
+        subprocess.call(['rm', '-rf', tmpdir])
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..d49c26c
--- /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..e1be742
--- /dev/null
@@ -0,0 +1,71 @@
+#!/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
+
+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/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..f5b296c
--- /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"
index a0b7a3de5e7c4c3709c5944c94f58e9bd3b1e37d..d45ce303bb4b4e9c44c7d4486de7669a568f1b04 100755 (executable)
@@ -24,13 +24,15 @@ case "$pyver" in
         apt-get install -y \
                 $common_debs \
                 python2.7-dev python-fuse \
-                python-"$xattr" python-tornado
+                python-"$xattr" python-tornado python-pytest \
+                python-pytest-xdist
         ;;
     python3)
         apt-get install -y \
                 $common_debs \
                 python3-dev python3-distutils python3-fuse \
-                python3-"$xattr" python3-tornado
+                python3-"$xattr" python3-tornado python3-pytest \
+                python3-pytest-xdist
         ;;
     *)
         usage 1>&2
index 66572a13b4dba2b9385df8b895715b66614b7c39..9631b412cf2d284027f17db4cc2322881899769f 100755 (executable)
@@ -7,9 +7,6 @@ usage()
     echo "Usage: prep-for-freebsd-build [python2|python3]"
 }
 
-common_pkgs='gmake git bash rsync curl par2cmdline readline duplicity'
-common_pkgs="$common_pkgs rsnapshot"
-
 pyver="${1:-python2}"
 
 # Install build deps
@@ -19,12 +16,18 @@ pkg update
 # https://reviews.freebsd.org/D24816
 pkg install rdiff-backup || true
 
+pkgs='gmake git bash rsync curl par2cmdline readline duplicity'
+pkgs="$pkgs rsnapshot"
+
 case "$pyver" in
     python2)
-        pkg install $common_pkgs python2 py27-tornado
+        pkgs="$pkgs python2 py27-tornado py27-pip"
+        pkg install $pkgs
+        pip-2.7 install --user pytest pytest-xdist
         ;;
     python3)
-        pkg install $common_pkgs python3 py37-tornado
+        pkgs="$pkgs python37 py37-tornado py37-pytest py37-pytest-xdist"
+        pkg install $pkgs
         ;;
     *)
         usage 1>&2
index d79fd043abc45a0354e8fa60c6943b05907d7645..94233a5091c62557fa9ae07472dd9a13b7f8e35c 100755 (executable)
@@ -20,8 +20,15 @@ brew link --force readline
 # "brew unlink readline" will undo this hack
 
 case "$pyver" in
-    python2) ;;
-    python3) brew install python ;;
+    python2)
+        easy_install-2.7 --user pip
+        /Users/anka/Library/Python/2.7/bin/pip install --user pytest pytest-xdist
+        ;;
+    python3)
+        brew install python
+        easy_install --user pip
+        pip3 install --user pytest pytest-xdist
+        ;;
     *)
         usage 1>&2
         exit 2
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..34bb117
--- /dev/null
@@ -0,0 +1,99 @@
+#!/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
+
+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/dev/subtree-hash b/dev/subtree-hash
new file mode 100755 (executable)
index 0000000..e3468fb
--- /dev/null
@@ -0,0 +1,58 @@
+#!/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
+
+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/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/pytest b/pytest
new file mode 100755 (executable)
index 0000000..f35f626
--- /dev/null
+++ b/pytest
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+set -eu
+
+script_home="$(cd "$(dirname "$0")" && pwd -P)"
+testlibdir="$script_home/test/lib"
+
+export PYTHONPATH="$testlibdir${PYTHONPATH:+:$PYTHONPATH}"
+exec dev/bup-python -m pytest -v -m 'not release' "$@"
diff --git a/pytest.ini b/pytest.ini
new file mode 100644 (file)
index 0000000..1ba300b
--- /dev/null
@@ -0,0 +1,7 @@
+
+[pytest]
+
+testpaths = test/int test/ext
+
+markers =
+    release: tests to check that the tree is ready for a release
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/bin/sort-z b/test/bin/sort-z
new file mode 120000 (symlink)
index 0000000..36ca24a
--- /dev/null
@@ -0,0 +1 @@
+../../dev/sort-z
\ No newline at end of file
diff --git a/test/ext/conftest.py b/test/ext/conftest.py
new file mode 100644 (file)
index 0000000..a79d033
--- /dev/null
@@ -0,0 +1,76 @@
+
+from subprocess import CalledProcessError
+import pytest, subprocess, sys
+
+from bup.compat import fsdecode
+from bup.io import byte_stream
+
+# Handle all test-* files as wvtest protocol subprocesses
+# cf. https://docs.pytest.org/en/latest/example/nonpython.html
+
+class BupSubprocFailure(Exception):
+    def __init__(self, msg, cmd, status, failures):
+        super(BupSubprocFailure, self).__init__(msg)
+        self.cmd = cmd
+        self.status = status
+        self.failures = failures
+
+class BupSubprocTestRunner(pytest.Item):
+
+    def __init__(self, name, parent):
+        super(BupSubprocTestRunner, self).__init__(name, parent)
+
+    def runtest(self):
+        cmd = str(self.fspath)
+        p = subprocess.Popen(cmd,
+                             stdout=subprocess.PIPE,
+                             stderr=subprocess.STDOUT)
+        out = p.communicate()[0]
+        sys.stdout.flush()
+        byte_stream(sys.stdout).write(out)
+        failures = [line for line in out.splitlines()
+                    if (line.startswith(b'!')
+                        and line.lower().endswith(b' failed'))]
+        if failures or p.returncode != 0:
+            raise BupSubprocFailure('%s failed (exit %d, %d failures)'
+                                    % (cmd, p.returncode, len(failures)),
+                                    cmd, p.returncode, failures)
+
+    def repr_failure(self, excinfo):
+        ex = excinfo.value
+        if isinstance(ex, BupSubprocFailure):
+            msg = ['Exit status: %d' % ex.status,
+                   'Failures:']
+            msg.extend(fsdecode(s) for s in ex.failures)
+            return '\n'.join(msg)
+
+    def reportinfo(self):
+        # This does not appear to be documented, but is in the
+        # example, and sets the final report header line (at least)
+        # for failures.
+        test_name = str(self.fspath)
+        linenum = None
+        return self.fspath, linenum, test_name
+
+class BupSubprocTestFile(pytest.File):
+    def collect(self):
+        name = self.fspath.basename
+        # name='' because there's only one test: running the command.
+        # i.e there are no sub-tests.  Otherwise the status messages
+        # duplicate the test name like this:
+        #   test/ext/test-cat-file.sh::test-cat-file.sh PASSED ...
+        try:
+            yield BupSubprocTestRunner.from_parent(self, name='')
+        except AttributeError:
+            yield BupSubprocTestRunner('', self)
+
+def pytest_collect_file(parent, path):
+    base = path.basename
+    if base.startswith('test-') and not base.endswith('~'):
+        try:
+            item = BupSubprocTestFile.from_parent(parent, fspath=path)
+        except AttributeError:
+            item = BupSubprocTestFile(path, parent)
+        if base == 'test-release-archive':
+            item.add_marker(pytest.mark.release)
+        return item
diff --git a/test/ext/test-cat-file b/test/ext/test-cat-file
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 b/test/ext/test-command-without-init-fails
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 b/test/ext/test-compression
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 b/test/ext/test-drecurse
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 b/test/ext/test-fsck
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-fuse b/test/ext/test-fuse
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 b/test/ext/test-gc
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-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 b/test/ext/test-import-duplicity
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 b/test/ext/test-import-rdiff-backup
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 b/test/ext/test-index
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-index-check-device b/test/ext/test-index-check-device
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 b/test/ext/test-index-clear
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-list-idx b/test/ext/test-list-idx
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 b/test/ext/test-main
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 b/test/ext/test-meta
new file mode 100755 (executable)
index 0000000..0f8bb60
--- /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/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-misc b/test/ext/test-misc
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/ext/test-on b/test/ext/test-on
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-redundant-saves b/test/ext/test-redundant-saves
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 b/test/ext/test-release-archive
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 b/test/ext/test-restore-map-owner
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 b/test/ext/test-restore-single-file
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 b/test/ext/test-rm
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-rm-between-index-and-save b/test/ext/test-rm-between-index-and-save
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-save-creates-no-unrefs b/test/ext/test-save-creates-no-unrefs
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 b/test/ext/test-save-restore-excludes
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 b/test/ext/test-save-strip-graft
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 b/test/ext/test-save-with-valid-parent
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 b/test/ext/test-sparse-files
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 b/test/ext/test-split-join
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 b/test/ext/test-tz
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 b/test/ext/test-web
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 b/test/ext/test-xdev
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_argv.py b/test/ext/test_argv.py
new file mode 100644 (file)
index 0000000..cc13fd7
--- /dev/null
@@ -0,0 +1,18 @@
+
+from __future__ import absolute_import, print_function
+
+from random import randint
+from subprocess import CalledProcessError, check_output
+from sys import stderr, stdout
+
+
+from test.lib.wvpytest import wvpasseq
+
+def rand_bytes(n):
+    return bytes([randint(1, 255) for x in range(n)])
+
+def test_argv():
+    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_ftp.py b/test/ext/test_ftp.py
new file mode 100644 (file)
index 0000000..d6bb273
--- /dev/null
@@ -0,0 +1,129 @@
+
+from __future__ import absolute_import, print_function
+from os import chdir, mkdir, symlink, unlink
+from subprocess import PIPE
+from time import localtime, strftime, tzset
+
+from bup.compat import environ
+from bup.helpers import unlink as unlink_if_exists
+from buptest import ex, exo
+from wvpytest import wvfail, wvpass, wvpasseq, wvpassne, wvstart
+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'
+
+import subprocess
+
+def test_ftp(tmpdir):
+    environ[b'BUP_DIR'] = tmpdir + b'/repo'
+    environ[b'GIT_DIR'] = tmpdir + b'/repo'
+    environ[b'TZ'] = b'UTC'
+    tzset()
+
+    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_get.py b/test/ext/test_get.py
new file mode 100644 (file)
index 0000000..86cc756
--- /dev/null
@@ -0,0 +1,968 @@
+
+from __future__ import print_function
+from errno import ENOENT
+from itertools import product
+from os import chdir, mkdir, rename
+from shutil import rmtree
+from subprocess import PIPE
+import pytest, re, sys
+
+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
+from wvpytest 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':')
+
+
+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))
+    
+    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)
+    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(get_disposition, src_info):
+    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_common(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_pick_force(get_disposition, src_info):
+    _test_pick_common(get_disposition, src_info, force=True)
+
+def _test_pick_noforce(get_disposition, src_info):
+    _test_pick_common(get_disposition, src_info, force=False)
+
+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')
+
+categories = ('replace', 'universal', 'ff', 'append', 'pick_force', 'pick_noforce', 'new_tag', 'unnamed')
+
+@pytest.mark.parametrize("disposition,category", product(dispositions_to_test, categories))
+def test_get(tmpdir, disposition, category):
+    chdir(tmpdir)
+    try:
+        src_info = create_get_src()
+        globals().get('_test_' + category)(disposition, src_info)
+    finally:
+        chdir(top)
diff --git a/test/ext/test_prune_older.py b/test/ext/test_prune_older.py
new file mode 100644 (file)
index 0000000..fd44fdf
--- /dev/null
@@ -0,0 +1,217 @@
+
+from __future__ import absolute_import, print_function
+from collections import defaultdict
+from itertools import chain, dropwhile, groupby, takewhile
+from os import chdir
+from random import choice, randint
+from shutil import copytree, rmtree
+from subprocess import PIPE
+from sys import stderr
+from time import localtime, strftime, time, tzset
+import random, sys
+
+if sys.version_info[:2] >= (3, 5):
+    from difflib import diff_bytes, unified_diff
+else:
+    from difflib import unified_diff
+
+from bup import compat
+from bup.compat import environ
+from bup.helpers import partition, period_as_secs, readpipe
+from bup.io import byte_stream
+from buptest import ex, exo
+from wvpytest import wvfail, wvpass, wvpasseq, wvpassne, wvstart
+import bup.path
+
+if sys.version_info[:2] < (3, 5):
+    def diff_bytes(_, *args):
+        return unified_diff(*args)
+
+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 diff_bytes(unified_diff,
+                               [result_diffline(x) for x in expected],
+                               [result_diffline(x) for x in actual],
+                               fromfile=b'expected', tofile=b'actual'):
+            sys.stderr.flush()
+            byte_stream(sys.stderr).write(line)
+    wvpass(expected == actual)
+
+
+def test_prune_older(tmpdir):
+    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()
+
+    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/int/__init__.py b/test/int/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/test/int/test_bloom.py b/test/int/test_bloom.py
new file mode 100644 (file)
index 0000000..69a5e46
--- /dev/null
@@ -0,0 +1,54 @@
+
+from __future__ import absolute_import, print_function
+import os
+import errno, platform, tempfile
+import logging
+
+from bup import bloom
+from bup.helpers import mkdirp
+
+def test_bloom(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)
+        assert 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)
+        assert all_present
+        false_positives = 0
+        for h in [os.urandom(20) for i in range(1000)]:
+            if b.exists(h):
+                false_positives += 1
+        assert false_positives < 5
+        os.unlink(tmpdir + b'/pybuptest.bloom')
+
+    tf = tempfile.TemporaryFile(dir=tmpdir)
+    b = bloom.create(b'bup.bloom', f=tf, expected=100)
+    assert b.rwfile == tf
+    assert 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)
+        assert b.k == 4
+    except EnvironmentError as ex:
+        (ptr_width, linkage) = platform.architecture()
+        if ptr_width == '32bit' and ex.errno == errno.ENOMEM:
+            logging.getLogger().info('skipping large bloom filter test (mmap probably failed) '
+                  + str(ex))
+        else:
+            raise
diff --git a/test/int/test_client.py b/test/int/test_client.py
new file mode 100644 (file)
index 0000000..f5199ec
--- /dev/null
@@ -0,0 +1,168 @@
+
+from __future__ import absolute_import
+import sys, os, stat, time, random, subprocess, glob
+import pytest
+
+from bup import client, git, path
+from bup.compat import bytes_from_uint, environ, range
+from bup.helpers import mkdirp
+
+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'
+
+
+def test_server_split_with_indexes(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()
+
+
+def test_multiple_suggestions(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()
+    assert len(glob.glob(git.repo(b'objects/pack'+IDX_PAT))) == 2
+
+    c = client.Client(bupdir, create=True)
+    assert len(glob.glob(c.cachedir+IDX_PAT)) == 0
+    rw = c.new_packwriter()
+    s1sha = rw.new_blob(s1)
+    assert 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
+    assert len(glob.glob(c.cachedir+IDX_PAT)) == 2 or c.conn.has_input()
+    rw.new_blob(s2)
+    assert rw.objcache.exists(s1sha)
+    assert rw.objcache.exists(s2sha)
+    rw.new_blob(s3)
+    assert len(glob.glob(c.cachedir+IDX_PAT)) == 2
+    rw.close()
+    assert len(glob.glob(c.cachedir+IDX_PAT)) == 3
+
+
+def test_dumb_client_server(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()
+    assert len(glob.glob(c.cachedir+IDX_PAT)) == 1
+    rw.new_blob(s1)
+    assert len(glob.glob(c.cachedir+IDX_PAT)) == 1
+    rw.new_blob(s2)
+    rw.close()
+    assert len(glob.glob(c.cachedir+IDX_PAT)) == 2
+
+
+def test_midx_refreshing(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')
+    assert len(pi.packs) == 2
+    pi.refresh()
+    assert len(pi.packs) == 2
+    assert sorted([os.path.basename(i.name) for i in pi.packs]) == sorted([p1base, p2base])
+
+    p1 = git.open_idx(p1name)
+    assert p1.exists(s1sha)
+    p2 = git.open_idx(p2name)
+    assert not p2.exists(s1sha)
+    assert p2.exists(s2sha)
+
+    subprocess.call([path.exe(), b'midx', b'-f'])
+    pi.refresh()
+    assert len(pi.packs) == 1
+    pi.refresh(skip_midx=True)
+    assert len(pi.packs) == 2
+    pi.refresh(skip_midx=False)
+    assert len(pi.packs) == 1
+
+
+def test_remote_parsing():
+    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:
+        assert client.parse_remote(remote) == values
+
+    with pytest.raises(client.ClientError):
+        client.parse_remote(b'http://asdf.com/bup')
diff --git a/test/int/test_compat.py b/test/int/test_compat.py
new file mode 100644 (file)
index 0000000..df2a03f
--- /dev/null
@@ -0,0 +1,30 @@
+
+from __future__ import absolute_import, print_function
+
+from bup.compat import pending_raise
+from wvpytest import wvpasseq
+
+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/test_git.py b/test/int/test_git.py
new file mode 100644 (file)
index 0000000..c62989d
--- /dev/null
@@ -0,0 +1,513 @@
+
+from __future__ import absolute_import, print_function
+import sys
+from binascii import hexlify, unhexlify
+from subprocess import check_call
+import struct, os, time
+import pytest
+
+from wvpytest import *
+
+from bup import git, path
+from bup.compat import bytes_from_byte, environ, range
+from bup.helpers import localtime, log, mkdirp, readpipe
+
+
+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)
+
+
+def test_git_version_detection():
+    # 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?')):
+        assert expected == git.is_suitable_git(ver_str=ver)
+        try:
+            if expected == 'insufficient':
+                with pytest.raises(SystemExit):
+                    git.require_suitable_git(ver)
+            elif expected == 'suitable':
+                git.require_suitable_git(ver_str=ver)
+            elif expected == 'unrecognized':
+                with pytest.raises(git.GitError):
+                    git.require_suitable_git(ver)
+            else:
+                assert 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
+
+
+def test_mangle():
+    afile  = 0o100644
+    afile2 = 0o100770
+    alink  = 0o120000
+    adir   = 0o040000
+    adir2  = 0o040777
+    assert git.mangle_name(b'a', adir2, adir) == b'a'
+    assert git.mangle_name(b'.bup', adir2, adir) == b'.bup.bupl'
+    assert 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))
+
+
+def test_encode():
+    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')
+
+
+def test_packs(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))
+
+
+def test_pack_name_lookup(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))
+
+
+def test_long_index(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)
+
+
+def test_check_repo_or_die(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)
+
+
+def test_commit_parsing(tmpdir):
+    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()
+
+    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)
+
+
+def test_new_commit(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)
+
+
+def test_list_refs(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)
+
+
+def test_git_date_str():
+    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))
+
+
+def test_cat_pipe(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)
+
+def test_midx_close(tmpdir):
+    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)
+
+    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/test_hashsplit.py b/test/int/test_hashsplit.py
new file mode 100644 (file)
index 0000000..41d2ffb
--- /dev/null
@@ -0,0 +1,129 @@
+
+from __future__ import absolute_import
+from io import BytesIO
+
+from wvpytest import *
+
+from bup import hashsplit, _helpers, helpers
+from bup.compat import byte_int, bytes_from_uint
+
+
+def nr_regions(x, max_count=None):
+    return list(hashsplit._nonresident_page_regions(bytearray(x), 1, max_count))
+
+
+def test_nonresident_page_regions():
+    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)])
+
+
+def test_uncache_ours_upto():
+    history = []
+    def mock_fadvise_pages_done(f, ofs, len):
+        history.append((f, ofs, len))
+
+    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
+
+
+def test_rolling_sums():
+    WVPASS(_helpers.selftest())
+
+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
+
+    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/test_helpers.py b/test/int/test_helpers.py
new file mode 100644 (file)
index 0000000..8bfea77
--- /dev/null
@@ -0,0 +1,232 @@
+
+from __future__ import absolute_import
+from time import tzset
+import math, os, os.path, re, subprocess
+from bup import helpers
+
+from wvpytest 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)
+import bup._helpers as _helpers
+
+
+def test_parse_num():
+    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))
+
+def test_detect_fakeroot():
+    if b'FAKEROOTKEY' in environ:
+        WVPASS(detect_fakeroot())
+    else:
+        WVPASS(not detect_fakeroot())
+
+def test_path_components():
+    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')
+
+
+def test_stripped_path_components():
+    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', [])
+
+
+def test_grafted_path_components():
+    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', [])
+
+
+def test_shstr():
+    # 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")
+
+
+def test_readpipe():
+    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)
+
+
+def test_batchpipe():
+    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)
+
+
+def test_atomically_replaced_file(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()
+
+
+def test_utc_offset_str():
+    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
+
+def test_valid_save_name():
+    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/test_index.py b/test/int/test_index.py
new file mode 100644 (file)
index 0000000..1ab4828
--- /dev/null
@@ -0,0 +1,172 @@
+
+from __future__ import absolute_import, print_function
+import os, time
+
+from wvpytest import *
+
+from bup import index, metadata
+from bup.compat import fsencode
+from bup.helpers import mkdirp, resolve_parent
+import bup.xstat as xstat
+
+
+lib_t_dir = os.path.dirname(fsencode(__file__))
+
+
+def test_index_basic():
+    cd = os.path.realpath(os.path.join(lib_t_dir, 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')
+
+
+def test_index_writer(tmpdir):
+    orig_cwd = os.getcwd()
+    try:
+        os.chdir(tmpdir)
+        ds = xstat.stat(b'.')
+        fs = xstat.stat(lib_t_dir + b'/test_index.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
+
+def test_index_negative_timestamps(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())
+
+
+def test_index_dirty(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'/test_index.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/test_metadata.py b/test/int/test_metadata.py
new file mode 100644 (file)
index 0000000..62d15c9
--- /dev/null
@@ -0,0 +1,299 @@
+
+from __future__ import absolute_import, print_function
+import errno, glob, grp, pwd, stat, tempfile, subprocess
+import os, sys
+import pytest
+
+from wvpytest 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
+import bup.helpers as helpers
+from bup.compat import fsencode
+
+lib_t_dir = os.path.dirname(fsencode(__file__))
+
+top_dir = os.path.realpath(os.path.join(lib_t_dir, b'..', b'..'))
+
+bup_path = top_dir + b'/bup'
+
+
+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')
+
+
+def test_clean_up_archive_path():
+    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'.')
+
+
+def test_risky_path():
+    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'))
+
+
+def test_clean_up_extract_path():
+    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')
+
+
+def test_metadata_method(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 ''
+
+
+def test_from_path_error(tmpdir):
+    if is_superuser() or detect_fakeroot():
+        return
+    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
+
+
+def test_apply_to_path_restricted_access(tmpdir):
+    if is_superuser() or detect_fakeroot():
+        return
+    if sys.platform.startswith('cygwin'):
+        return # chmod 000 isn't effective.
+    try:
+        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(b'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)):
+            assert str(helpers.saved_errors[i]).startswith(expected_errors[i])
+    finally:
+        clear_errors()
+
+
+def test_restore_over_existing_target(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
+
+from bup.metadata import xattr
+if xattr:
+    def remove_selinux(attrs):
+        return list(filter(lambda i: not i in (b'security.selinux', ),
+                           attrs))
+
+    def test_handling_of_incorrect_existing_linux_xattrs():
+        if not is_superuser() or detect_fakeroot():
+            pytest.skip('skipping test -- not superuser')
+            return
+        if not setup_testfs():
+            pytest.skip('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')
+        cleanup_testfs()
diff --git a/test/int/test_options.py b/test/int/test_options.py
new file mode 100644 (file)
index 0000000..7db9fcb
--- /dev/null
@@ -0,0 +1,104 @@
+
+from __future__ import absolute_import
+
+from wvpytest import *
+
+from bup import options
+
+
+def test_optdict():
+    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
+"""
+
+
+def test_invalid_optspec():
+    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]
+"""
+
+def test_options():
+    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/test_resolve.py b/test/int/test_resolve.py
new file mode 100644 (file)
index 0000000..cf66eb3
--- /dev/null
@@ -0,0 +1,312 @@
+
+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
+import os
+from time import localtime, strftime
+
+from wvpytest 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
+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(tmpdir, create_repo, test_repo):
+    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
+
+    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/../../..'):
+        vfs.clear_cache()
+        res = resolve(path)
+        wvpasseq(((b'', vfs._root),), res)
+
+    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)
+
+    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)
+
+    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)
+
+    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)
+
+    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)
+
+    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)
+
+    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)
+
+    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)
+
+    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'):
+        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/../..'):
+        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])
+
+    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)
+
+    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/.'):
+            vfs.clear_cache()
+            res = resolver(path)
+            wvpasseq(4, len(res))
+            wvpasseq(expected, res)
+    vfs.clear_cache()
+    res = resolve(path)
+    wvpasseq(4, len(res))
+    wvpasseq(expected, res)
+
+def test_local_resolve(tmpdir):
+    prep_and_test_repo(tmpdir,
+                       lambda x: LocalRepo(repo_dir=x), _test_resolve)
+
+def test_remote_resolve(tmpdir):
+    prep_and_test_repo(tmpdir,
+                       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])
+
+def test_local_resolve_loop(tmpdir):
+    prep_and_test_repo(tmpdir,
+                       lambda x: LocalRepo(x), _test_resolve_loop)
+
+def test_remote_resolve_loop(tmpdir):
+    prep_and_test_repo(tmpdir,
+                       lambda x: RemoteRepo(x), _test_resolve_loop)
+
+# FIXME: add tests for the want_meta=False cases.
diff --git a/test/int/test_shquote.py b/test/int/test_shquote.py
new file mode 100644 (file)
index 0000000..224d55e
--- /dev/null
@@ -0,0 +1,52 @@
+
+from __future__ import absolute_import
+
+from wvpytest import *
+
+from bup import shquote
+
+
+def qst(line):
+    return [word for offset,word in shquote.quotesplit(line)]
+
+def test_shquote():
+    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/test_vfs.py b/test/int/test_vfs.py
new file mode 100644 (file)
index 0000000..8c3e927
--- /dev/null
@@ -0,0 +1,380 @@
+
+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
+import os
+import sys
+from time import localtime, strftime, tzset
+
+from wvpytest 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
+from buptest.vfs import tree_dict
+
+lib_t_dir = os.path.dirname(fsencode(__file__))
+top_dir = os.path.join(lib_t_dir, b'../..')
+bup_path = top_dir + b'/bup'
+
+def ex(cmd, **kwargs):
+    print(shstr(cmd), file=stderr)
+    return exc(cmd, **kwargs)
+
+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)
+
+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)
+
+
+def test_item_mode():
+    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)))
+
+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')))
+
+def test_misc(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()
+
+    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)
+
+    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))
+
+    run_augment_item_meta_tests(repo,
+                                b'/test/latest/file', 7,
+                                b'/test/latest/symlink', b'file')
+
+    # 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)
+
+def test_read_and_seek(tmpdir):
+    # 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.
+    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)
+
+def test_contents_with_mismatched_bupm_git_ordering(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))
+
+def test_duplicate_save_dates(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))))
+
+def test_item_read_write():
+    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/test_vint.py b/test/int/test_vint.py
new file mode 100644 (file)
index 0000000..c2b4818
--- /dev/null
@@ -0,0 +1,86 @@
+
+from __future__ import absolute_import
+from io import BytesIO
+
+from wvpytest import *
+
+from bup import vint
+
+
+def encode_and_decode_vuint(x):
+    f = BytesIO()
+    vint.write_vuint(f, x)
+    return vint.read_vuint(BytesIO(f.getvalue()))
+
+
+def test_vuint():
+        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()))
+
+
+def test_vint():
+    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()))
+
+
+def test_bvec():
+    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)
+
+
+def test_pack_and_unpack():
+    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/test_xstat.py b/test/int/test_xstat.py
new file mode 100644 (file)
index 0000000..b35a57f
--- /dev/null
@@ -0,0 +1,105 @@
+
+from __future__ import absolute_import
+import math, tempfile, subprocess
+
+from wvpytest import *
+
+import bup._helpers as _helpers
+from bup import xstat
+
+
+def test_fstime():
+    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))
+
+
+def test_bup_utimensat(tmpdir):
+    if not xstat._bup_utimensat:
+        return
+    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])
+
+
+def test_bup_utimes(tmpdir):
+    if not xstat._bup_utimes:
+        return
+    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)
+
+
+def test_bup_lutimes(tmpdir):
+    if not xstat._bup_lutimes:
+        return
+    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/__init__.py b/test/lib/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/test/lib/buptest/__init__.py b/test/lib/buptest/__init__.py
new file mode 100644 (file)
index 0000000..d9aeaae
--- /dev/null
@@ -0,0 +1,64 @@
+
+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 bup import helpers
+from bup.compat import fsencode, str_type
+from bup.io import byte_stream
+
+
+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/lib/wvpytest.py b/test/lib/wvpytest.py
new file mode 100644 (file)
index 0000000..523a3de
--- /dev/null
@@ -0,0 +1,48 @@
+import pytest
+
+def WVPASS(cond = True):
+    assert cond
+
+def WVFAIL(cond = True):
+    assert not cond
+
+def WVPASSEQ(a, b):
+    assert a == b
+
+def WVPASSNE(a, b):
+    assert a != b
+
+def WVPASSLT(a, b):
+    assert a < b
+
+def WVPASSLE(a, b):
+    assert a <= b
+
+def WVPASSGT(a, b):
+    assert a > b
+
+def WVPASSGE(a, b):
+    assert a >= b
+
+def WVEXCEPT(etype, func, *args, **kwargs):
+    with pytest.raises(etype):
+        func(*args, **kwargs)
+
+def WVCHECK(cond, msg):
+    assert cond, msg
+
+def WVMSG(msg):
+    print(msg)
+
+wvpass = WVPASS
+wvfail = WVFAIL
+wvpasseq = WVPASSEQ
+wvpassne = WVPASSNE
+wvpaslt = WVPASSLT
+wvpassle = WVPASSLE
+wvpassgt = WVPASSGT
+wvpassge = WVPASSGE
+wvexcept = WVEXCEPT
+wvcheck = WVCHECK
+wvmsg = WVMSG
+wvstart = WVMSG
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
diff --git a/wvtest b/wvtest
deleted file mode 100755 (executable)
index 7d494f3..0000000
--- a/wvtest
+++ /dev/null
@@ -1,325 +0,0 @@
-#!/usr/bin/env perl
-#
-# WvTest:
-#   Copyright (C) 2007-2009 Versabanq Innovations Inc. and contributors.
-#   Copyright (C) 2015 Rob Browning <rlb@defaultvalue.org>
-#       Licensed under the GNU Library General Public License, version 2.
-#       See the included file named LICENSE for license information.
-#
-use strict;
-use warnings;
-use Getopt::Long qw(GetOptionsFromArray :config no_ignore_case bundling);
-use Pod::Usage;
-use Time::HiRes qw(time);
-
-my $per_test_warn_time = 100000;  # upstream was 500
-my $per_test_bad_time = 100000;  # upstream was 1000
-my $overall_test_warn_time = 100000;  # upstream was 2000
-my $overall_test_bad_time = 100000;  # upstream was 5000
-
-my $pid;
-my $istty = -t STDOUT;
-my @log = ();
-
-sub bigkill($)
-{
-    my $pid = shift;
-
-    if (@log) {
-       print "\n" . join("\n", @log) . "\n";
-    }
-
-    print STDERR "\n! Killed by signal    FAILED\n";
-
-    ($pid > 0) || die("pid is '$pid'?!\n");
-
-    local $SIG{CHLD} = sub { }; # this will wake us from sleep() faster
-    kill 15, $pid;
-    sleep(2);
-
-    if ($pid > 1) {
-       kill 9, -$pid;
-    }
-    kill 9, $pid;
-
-    exit(125);
-}
-
-sub colourize($)
-{
-    my $result = shift;
-    my $pass = ($result eq "ok");
-
-    if ($istty) {
-       my $colour = $pass ? "\e[32;1m" : "\e[31;1m";
-       return "$colour$result\e[0m";
-    } else {
-       return $result;
-    }
-}
-
-sub mstime($$$)
-{
-    my ($floatsec, $warntime, $badtime) = @_;
-    my $ms = int($floatsec * 1000);
-    my $str = sprintf("%d.%03ds", $ms/1000, $ms % 1000);
-
-    if ($istty && $ms > $badtime) {
-        return "\e[31;1m$str\e[0m";
-    } elsif ($istty && $ms > $warntime) {
-        return "\e[33;1m$str\e[0m";
-    } else {
-        return "$str";
-    }
-}
-
-sub resultline($$)
-{
-    my ($name, $result) = @_;
-    return sprintf("! %-65s %s", $name, colourize($result));
-}
-
-my ($start, $stop);
-
-sub endsect()
-{
-    $stop = time();
-    if ($start) {
-       printf " %s %s\n",
-            mstime($stop - $start, $per_test_warn_time, $per_test_bad_time),
-            colourize("ok");
-    }
-}
-
-sub run
-{
-    # dup_msgs should be true when "watching".  In that case all top
-    # level wvtest protocol messages should be duplicated to stderr so
-    # that they can be safely captured for report to process later.
-    my ($dup_msgs) = @_;
-    my $show_counts = 1;
-    GetOptionsFromArray(\@ARGV, 'counts!', \$show_counts)
-        or pod2usage();
-    pod2usage('$0: no command specified') if (@ARGV < 1);
-
-    # always flush
-    $| = 1;
-
-    {
-        my $msg = "Testing \"all\" in @ARGV:\n";
-        print $msg;
-        print STDERR $msg if $dup_msgs;
-    }
-
-    $pid = open(my $fh, "-|");
-    if (!$pid) {
-        # child
-        setpgrp();
-        open STDERR, '>&STDOUT' or die("Can't dup stdout: $!\n");
-        exec(@ARGV);
-        exit 126; # just in case
-    }
-
-    # parent
-    my $allstart = time();
-    local $SIG{INT} = sub { bigkill($pid); };
-    local $SIG{TERM} = sub { bigkill($pid); };
-    local $SIG{ALRM} = sub {
-        print STDERR resultline('Alarm timed out!  No test results for too long.\n',
-                                'FAILED');
-        bigkill($pid);
-    };
-
-    my ($gpasses, $gfails) = (0,0);
-    while (<$fh>)
-    {
-        chomp;
-        s/\r//g;
-
-        if (/^\s*Testing "(.*)" in (.*):\s*$/)
-        {
-            alarm(300);
-            my ($sect, $file) = ($1, $2);
-
-            endsect();
-
-            printf("! %s  %s: ", $file, $sect);
-            @log = ();
-            $start = $stop;
-        }
-        elsif (/^!\s*(.*?)\s+(\S+)\s*$/)
-        {
-            alarm(300);
-
-            my ($name, $result) = ($1, $2);
-            my $pass = ($result eq "ok");
-
-            if (!$start) {
-                printf("\n! Startup: ");
-                $start = time();
-            }
-
-            push @log, resultline($name, $result);
-
-            if (!$pass) {
-                $gfails++;
-                if (@log) {
-                    print "\n" . join("\n", @log) . "\n";
-                    @log = ();
-                }
-            } else {
-                $gpasses++;
-                print ".";
-            }
-        }
-        else
-        {
-            push @log, $_;
-        }
-    }
-
-    endsect();
-
-    my $newpid = waitpid($pid, 0);
-    if ($newpid != $pid) {
-        die("waitpid returned '$newpid', expected '$pid'\n");
-    }
-
-    my $code = $?;
-    my $ret = ($code >> 8);
-
-    # return death-from-signal exits as >128.  This is what bash does if you ran
-    # the program directly.
-    if ($code && !$ret) { $ret = $code | 128; }
-
-    if ($ret && @log) {
-        print "\n" . join("\n", @log) . "\n";
-    }
-
-    if ($code != 0) {
-        my $msg = resultline("Program returned non-zero exit code ($ret)",
-                             'FAILED');
-        print $msg;
-        print STDERR "$msg\n" if $dup_msgs;
-    }
-
-    print "\n";
-    if ($show_counts) {
-        my $gtotal = $gpasses + $gfails;
-        my $msg = sprintf("WvTest: %d test%s, %d failure%s\n",
-                          $gtotal, $gtotal == 1 ? "" : "s", $gfails,
-                          $gfails == 1 ? "" : "s");
-        print $msg;
-        print STDERR $msg if $dup_msgs;
-    }
-    {
-        my $msg = sprintf("WvTest: result code $ret, total time %s\n",
-                          mstime(time() - $allstart,
-                                 $overall_test_warn_time,
-                                 $overall_test_bad_time));
-        print $msg;
-        print STDERR $msg if $dup_msgs;
-    }
-    return ($ret ? $ret : ($gfails ? 125 : 0));
-}
-
-sub report()
-{
-    my ($gpasses, $gfails) = (0,0);
-    for my $f (@ARGV)
-    {
-        my $fh;
-        open($fh, '<:crlf', $f) or die "Unable to open $f: $!";
-        while (<$fh>)
-        {
-            chomp;
-            s/\r//g;
-
-            if (/^\s*Testing "(.*)" in (.*):\s*$/) {
-                @log = ();
-            }
-            elsif (/^!\s*(.*?)\s+(\S+)\s*$/) {
-                my ($name, $result) = ($1, $2);
-                my $pass = ($result eq "ok");
-                push @log, resultline($name, $result);
-                if (!$pass) {
-                    $gfails++;
-                    if (@log) {
-                        print "\n" . join("\n", @log) . "\n";
-                        @log = ();
-                    }
-                } else {
-                    $gpasses++;
-                }
-            }
-            else
-            {
-                push @log, $_;
-            }
-        }
-    }
-    my $gtotal = $gpasses + $gfails;
-    printf("\nWvTest: %d test%s, %d failure%s\n",
-           $gtotal, $gtotal == 1 ? "" : "s",
-           $gfails, $gfails == 1 ? "" : "s");
-    return ($gfails ? 125 : 0);
-}
-
-my ($show_help, $show_manual);
-Getopt::Long::Configure('no_permute');
-GetOptionsFromArray(\@ARGV,
-                    'help|?' => \$show_help,
-                    'man' => \$show_manual) or pod2usage();
-Getopt::Long::Configure('permute');
-pod2usage(-verbose => 1, -exitval => 0) if $show_help;
-pod2usage(-verbose => 2, -exitval => 0) if $show_manual;
-pod2usage(-msg => "$0: no action specified", -verbose => 1) if (@ARGV < 1);
-
-my $action = $ARGV[0];
-shift @ARGV;
-if ($action eq 'run') { exit run(0); }
-elsif ($action  eq 'watch') { run(1); }
-elsif ($action  eq 'report') { exit report(); }
-else { pod2usage(-msg => "$0: invalid action $action", -verbose => 1); }
-
-__END__
-
-=head1 NAME
-
-wvtest - the dumbest cross-platform test framework that could possibly work
-
-=head1 SYNOPSIS
-
-  wvtest [GLOBAL...] run [RUN_OPT...] [--] command [arg...]
-  wvtest [GLOBAL...] watch [RUN_OPT...] [--] command [arg...]
-  wvtest [GLOBAL...] report [logfile...]
-
-  GLOBAL:
-    --help, -?       display brief help message and exit
-    --man            display full documentation
-  RUN_OPT:
-    --[no-]counts    [don't] show success/failure counts
-
-=head1 DESCRIPTION
-
-B<wvtest run some-tests> will run some-tests and report on the result.
-This should work fine as long as some-tests doesn't run any sub-tests
-in parallel.
-
-If you'd like to run your tests in parallel, use B<watch> and
-B<report> as described in the EXAMPLES below.
-
-=head1 EXAMPLES
-
-  # Fine if ./tests doesn't produce any output in parallel.
-  wvtest run ./tests
-
-  # Use watch and report for parallel tests.  Note that watch's stderr will
-  # include copies of any top level messages - reporting non-zero
-  # test command exits, etc., and so must be included in the report arguments.
-  wvtest watch --no-counts \
-    "sh -c '(test-1 2>&1 | tee test-1.log)& (test-2 2>&1 | tee test-2.log)&'" \
-    2>test-3.log \
-  wvtest report test-1.log test-2.log test-3.log
-
-=cut
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 $?
 }
diff --git a/wvtest.py b/wvtest.py
deleted file mode 100755 (executable)
index 9d3ee49..0000000
--- a/wvtest.py
+++ /dev/null
@@ -1,246 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/dev/bup-python"
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-#
-# WvTest:
-#   Copyright (C)2007-2012 Versabanq Innovations Inc. and contributors.
-#       Licensed under the GNU Library General Public License, version 2.
-#       See the included file named LICENSE for license information.
-#       You can get wvtest from: http://github.com/apenwarr/wvtest
-#
-
-from __future__ import absolute_import, print_function
-from os.path import relpath
-import atexit
-import inspect
-import os
-import re
-import sys
-import traceback
-
-_start_dir = os.getcwd()
-
-# NOTE
-# Why do we do we need the "!= main" check?  Because if you run
-# wvtest.py as a main program and it imports your test files, then
-# those test files will try to import the wvtest module recursively.
-# That actually *works* fine, because we don't run this main program
-# when we're imported as a module.  But you end up with two separate
-# wvtest modules, the one that gets imported, and the one that's the
-# main program.  Each of them would have duplicated global variables
-# (most importantly, wvtest._registered), and so screwy things could
-# happen.  Thus, we make the main program module *totally* different
-# from the imported module.  Then we import wvtest (the module) into
-# wvtest (the main program) here and make sure to refer to the right
-# versions of global variables.
-#
-# All this is done just so that wvtest.py can be a single file that's
-# easy to import into your own applications.
-if __name__ != '__main__':   # we're imported as a module
-    _registered = []
-    _tests = 0
-    _fails = 0
-
-    def wvtest(func):
-        """ Use this decorator (@wvtest) in front of any function you want to
-            run as part of the unit test suite.  Then run:
-                python wvtest.py path/to/yourtest.py [other test.py files...]
-            to run all the @wvtest functions in the given file(s).
-        """
-        _registered.append(func)
-        return func
-
-
-    def _result(msg, tb, code):
-        global _tests, _fails
-        _tests += 1
-        if code != 'ok':
-            _fails += 1
-        (filename, line, func, text) = tb
-        filename = os.path.basename(filename)
-        msg = re.sub(r'\s+', ' ', str(msg))
-        sys.stderr.flush()
-        print('! %-70s %s' % ('%s:%-4d %s' % (filename, line, msg),
-                              code))
-        sys.stdout.flush()
-
-
-    def _caller_stack(wv_call_depth):
-        # Without the chdir, the source text lookup may fail
-        orig = os.getcwd()
-        os.chdir(_start_dir)
-        try:
-            return traceback.extract_stack()[-(wv_call_depth + 2)]
-        finally:
-            os.chdir(orig)
-
-
-    def _check(cond, msg = 'unknown', tb = None):
-        if tb == None: tb = _caller_stack(2)
-        if cond:
-            _result(msg, tb, 'ok')
-        else:
-            _result(msg, tb, 'FAILED')
-        return cond
-
-    def wvcheck(cond, msg, tb = None):
-        if tb == None: tb = _caller_stack(2)
-        if cond:
-            _result(msg, tb, 'ok')
-        else:
-            _result(msg, tb, 'FAILED')
-        return cond
-
-    _code_rx = re.compile(r'^\w+\((.*)\)(\s*#.*)?$')
-    def _code():
-        text = _caller_stack(2)[3]
-        return _code_rx.sub(r'\1', text)
-
-    def WVSTART(message):
-        filename = _caller_stack(1)[0]
-        sys.stderr.write('Testing \"' + message + '\" in ' + filename + ':\n')
-
-    def WVMSG(message):
-        ''' Issues a notification. '''
-        return _result(message, _caller_stack(1), 'ok')
-
-    def WVPASS(cond = True):
-        ''' Counts a test failure unless cond is true. '''
-        return _check(cond, _code())
-
-    def WVFAIL(cond = True):
-        ''' Counts a test failure  unless cond is false. '''
-        return _check(not cond, 'NOT(%s)' % _code())
-
-    def WVPASSEQ(a, b):
-        ''' Counts a test failure unless a == b. '''
-        return _check(a == b, '%s == %s' % (repr(a), repr(b)))
-
-    def WVPASSNE(a, b):
-        ''' Counts a test failure unless a != b. '''
-        return _check(a != b, '%s != %s' % (repr(a), repr(b)))
-
-    def WVPASSLT(a, b):
-        ''' Counts a test failure unless a < b. '''
-        return _check(a < b, '%s < %s' % (repr(a), repr(b)))
-
-    def WVPASSLE(a, b):
-        ''' Counts a test failure unless a <= b. '''
-        return _check(a <= b, '%s <= %s' % (repr(a), repr(b)))
-
-    def WVPASSGT(a, b):
-        ''' Counts a test failure unless a > b. '''
-        return _check(a > b, '%s > %s' % (repr(a), repr(b)))
-
-    def WVPASSGE(a, b):
-        ''' Counts a test failure unless a >= b. '''
-        return _check(a >= b, '%s >= %s' % (repr(a), repr(b)))
-
-    def WVEXCEPT(etype, func, *args, **kwargs):
-        ''' Counts a test failure unless func throws an 'etype' exception.
-            You have to spell out the function name and arguments, rather than
-            calling the function yourself, so that WVEXCEPT can run before
-            your test code throws an exception.
-        '''
-        try:
-            func(*args, **kwargs)
-        except etype as e:
-            return _check(True, 'EXCEPT(%s)' % _code())
-        except:
-            _check(False, 'EXCEPT(%s)' % _code())
-            raise
-        else:
-            return _check(False, 'EXCEPT(%s)' % _code())
-
-    wvstart = WVSTART
-    wvmsg = WVMSG
-    wvpass = WVPASS
-    wvfail = WVFAIL
-    wvpasseq = WVPASSEQ
-    wvpassne = WVPASSNE
-    wvpaslt = WVPASSLT
-    wvpassle = WVPASSLE
-    wvpassgt = WVPASSGT
-    wvpassge = WVPASSGE
-    wvexcept = WVEXCEPT
-
-    def wvfailure_count():
-        return _fails
-
-    def _check_unfinished():
-        if _registered:
-            for func in _registered:
-                print('WARNING: not run: %r' % (func,))
-            WVFAIL('wvtest_main() not called')
-        if _fails:
-            sys.exit(1)
-
-    atexit.register(_check_unfinished)
-
-
-def _run_in_chdir(path, func, *args, **kwargs):
-    oldwd = os.getcwd()
-    oldpath = sys.path
-    try:
-        os.chdir(path)
-        sys.path += [path, os.path.split(path)[0]]
-        return func(*args, **kwargs)
-    finally:
-        os.chdir(oldwd)
-        sys.path = oldpath
-
-
-def _runtest(fname, f):
-    mod = inspect.getmodule(f)
-    rpath = relpath(mod.__file__, os.getcwd()).replace('.pyc', '.py')
-    print()
-    print('Testing "%s" in %s:' % (fname, rpath))
-    sys.stdout.flush()
-    try:
-        _run_in_chdir(os.path.split(mod.__file__)[0], f)
-    except Exception as e:
-        print()
-        print(traceback.format_exc())
-        tb = sys.exc_info()[2]
-        wvtest._result(e, traceback.extract_tb(tb)[1], 'EXCEPTION')
-
-
-def _run_registered_tests():
-    import wvtest as _wvtestmod
-    while _wvtestmod._registered:
-        t = _wvtestmod._registered.pop(0)
-        _runtest(t.__name__, t)
-        print()
-
-
-def wvtest_main(extra_testfiles=tuple()):
-    import wvtest as _wvtestmod
-    _run_registered_tests()
-    for modname in extra_testfiles:
-        if not os.path.exists(modname):
-            print('Skipping: %s' % modname)
-            continue
-        if modname.endswith('.py'):
-            modname = modname[:-3]
-        print('Importing: %s' % modname)
-        path, mod = os.path.split(os.path.abspath(modname))
-        nicename = modname.replace(os.path.sep, '.')
-        while nicename.startswith('.'):
-            nicename = modname[1:]
-        _run_in_chdir(path, __import__, nicename, None, None, [])
-        _run_registered_tests()
-    print()
-    print('WvTest: %d tests, %d failures.' % (_wvtestmod._tests,
-                                              _wvtestmod._fails))
-
-
-if __name__ == '__main__':
-    import wvtest as _wvtestmod
-    sys.modules['wvtest'] = _wvtestmod
-    sys.modules['wvtest.wvtest'] = _wvtestmod
-    wvtest = _wvtestmod
-    wvtest_main(sys.argv[1:])
old mode 100755 (executable)
new mode 100644 (file)